#include "LinkedQueue.h"
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
// InitQueue: 分配并初始化一个队列：创建一个空链式队列
struct LinkedQueue*InitQueue()
{
    struct LinkedQueue*q = malloc(sizeof(*q));
    if(q == NULL)
        return NULL;
    q->front = q->rear = NULL;
    q->num = 0;

    return q;
}
// ClearQueue: 清空队列 -> 变成一个空队列
bool ClearQueue(struct LinkedQueue*q)
{
    if(q == NULL)
        return false;
    struct Node*p = q->front;//指向要删除的节点
    while(p)
    {
        q->front = q->front->next;
        p->next = NULL;
        free(p);
        p = q->front;
    }
    q->rear = NULL;
    q->num = 0;

    return true;
}
// DestroyQueue: 销毁一个队列
bool DestroyQueue(struct LinkedQueue*q)
{
    if(q == NULL)
        return false;
    ClearQueue(q);

    free(q);
    q = NULL;

    return true;
}

// QueueIsEmpty: 判断一个队列是否为空
bool QueueIsEmpty(struct LinkedQueue*q)
{
    if(q == NULL)
        return false;
    return q->front == NULL && q->rear == NULL && q->num == 0 ? true : false;
}
// QueueLength: 返回队列中元素的个数，即队列的长度
int QueueLength(struct LinkedQueue*q)
{
    if(q == NULL)
        return -1;
    return q->num;
}
// EnQueue: 入队
bool EnQueue(struct LinkedQueue*q, QElemType d)
{
    if(q == NULL)
        return false;
    
    struct Node*pnew = malloc(sizeof(*pnew));
    if(pnew == NULL)
        return false;
    pnew->data = d;
    pnew->next = NULL;

    if(QueueIsEmpty(q))
    {
        q->front = q->rear = pnew;
    }
    else
    {
        q->rear->next = pnew;
        q->rear = pnew;
    }
    q->num++;
    return true;
}
// DeQueue: 出队
bool DeQueue(struct LinkedQueue*q, QElemType* d)
{
    if(q == NULL || QueueIsEmpty(q))
        return false;
    struct Node*p = q->front;//指向出队节点
    if(d)
        *d = p->data;
    q->front = q->front->next;
    if(q->front == NULL)
        q->rear = NULL;
    p->next = NULL;
    free(p);
    p = NULL;

    q->num--;

    return true;

}
// GetHead: 获取队头的元素，但不出队。
bool GetHead(struct LinkedQueue*q, QElemType* d)
{
    if(q == NULL || QueueIsEmpty(q))
        return false;
   
    if(d)
        *d = q->front->data;
  

    return true;

}


void Print_LinkedQueue(struct LinkedQueue*q)
{
    if(q == NULL)
        return ;
    printf("=======\n");
    struct Node*p = q->front;
    while(p)
    {
        printf("%c ", p->data);
        p = p->next;
    }
    printf("\n");
}
/*
    构建一个链式队列，
    当用户输入数字时，将数字入队，当用户输入字母时，
    将队头元素出队。每次操作队列之后，将队列中的元素显示出来。
*/

void Func()
{
    struct LinkedQueue*q = InitQueue();
    if(q == NULL)
        return ;
    
    while(1)
    {
        char ch;
        scanf("%c", &ch);
        getchar();
        if(ch == '#')
            break;
        if(ch >= '0' &&ch <= '9')
        {
            EnQueue(q, ch);
        }
        else if((ch >= 'a' &&ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
        {
            DeQueue(q, NULL);
        }
        Print_LinkedQueue(q);
    }
    DestroyQueue(q);
    q = NULL;
}